/*
 * MIXPLAY.C Version 1.00 (C)1996 HUDSON SOFT
 * MIX 再生プログラム(MIXPLAY.C)
 */

#include    <system.h>
#include    <scsi.h>
#include    <syswork.h>
#include    <v93.h>
#include    "cdrscsi.h"
#include    "mixlib.h"

/* CD ROM が接続されている SCSI ID */
int scsi_id ;

/* 文字列の比較を行ないます
 *
 * ２つの文字列の '\0' までを比較します。大文字小文字は区別します。
 *
 * 入力：
 * char		    *p0;   文字列１へのポインタ
 * char		    *p1;   文字列２へのポインタ
 *
 * 出力：
 * int		    0      ２つの文字列が等しかった
 *		    負の数 文字列１の方が短いか文字が小さい
 *		    正の数 文字列１の方が長いか文字が大きい
 */
int	strcmp( p0, p1 )
char	*p0;
char	*p1;
{
    int	    res;
    int	    ch ;

    for ( ; (res=( (ch=*p0) - *p1))==0 && ch != 0 ; p0++, p1++ )
	; 
    return( res ) ;
}

/* 指定のブロックから始まる動画データの再生
 *
 * 指定のブロックから始まる動画連続再生データを再生します。RUN ボタンが押される
 * と終了します。
 *
 * 入力：
 * unsigned int	    sect;  再生開始ブロック
 *
 * 出力：
 * なし
 */
void	play_exec(sect)
unsigned int	sect;
{
    while((pad00.KD_DAT & KP_run) != 0)	/* RUN ボタンが押されていたら待つ */
	;				/* 再生前に押されていた場合の対処 */
    if (mix_start(scsi_id,sect,0)==0) {	/* 再生スタート */
	while( mix_check() == 0 ) {	/* 再生が続いているならば */
	    if ( (pad00.KD_DAT & KP_run) != 0 || mix_play_errt != 0 ) {
		mix_stop();		/* RUN ボタン押下かエラーが出た場合 */
		break;			/* 再生を停止して終了 */
	    }
	}
    }
}

/* 各トラックから動画データを検索しての動画データの再生
 *
 * CD-ROM に対し READ TOC コマンドを発行し、得られた情報からデータトラックを検
 * 索して、検索したデータトラックの先頭が動画データだった場合に動画再生を行ない
 * ます。
 *
 * １つのトラックの動画再生中に RUN ボタンが押されると、次のトラックの再生に移
 * ります。
 *
 * 転送エラーが起きて再生に失敗した場合は、中断して終了します。
 *
 * 入力：
 * なし
 *
 * 出力：
 * なし
 */
void	mix_play()
{
    static CD_INFO_TNUM	tnum;
    static CD_INFO_SECT	info;
    int			tn;
    unsigned int	sect;
    static unsigned int	read_buff[2048/sizeof(unsigned int)];
    MIX_HEAD		*mix;

    scsi_id=2;
/*  scsi_id=((struct BootInfo *)(boot_info))->scsiid; */
/* CD-ROM から起動した場合、本来は上記ように Boot したドライブから読み込むが */
/* このサンプルプログラムは CD-ROM からは起動しないので SCSI ID は 2 に固定。*/
/* CONFIG.SYS での TGFX.SYS の ID 設定と同じ値にする事。                     */
/* DEVICE = TGFX.SYS /ID=2                                                   */

    while( cdrom_unit_ready(scsi_id) != 0 )	/* CD-ROM 使用前に必ず必要 */
	;				/* init_scsi() や reset_scsi() の後 */
					/* に必ず必要です。 */

    cdrom_info_tnum(scsi_id,&tnum);	/* 最少、最大 トラック番号を得る */

    for ( tn=tnum.min_track ; tn <= tnum.max_track ; tn++ ) {
	cdrom_info_sect(scsi_id,&info,tn);	/* トラックの情報を得る */
	if ( info.typ == 0x04 ) {	/* テータトラックだった場合 */
	    sect = info.sect ;
	    cdrom_read(scsi_id,sect,read_buff,1);	/* １レコード読む */
	    mix = (MIX_HEAD *)read_buff;
	    if ( strcmp(mix->mixs,RTF_MAGIC)==0 ||
		 strcmp(mix->mixs,MIX_MAGIC)==0 ) {	/* 動画データか調べ */
		play_exec(sect);	/* sect から始まる動画データを再生 */
	    }
	}
	if ( mix_play_errt != 0 ) {	/* 転送エラーが起きた場合は終了 */
	    break;
	}
    }
    if (mix_play_errt != 0) {
	cdrom_eject(scsi_id);		/* ホストマシン側にエラーを通知する */
    } else {
	cdrom_stop(scsi_id);		/* ホストマシン側に終了を通知する */
    }
}
